# json_editor.py
import json
import os

DEFAULT_JSON_PATH = "piliang.json"

def get_newspapers_list(filepath=DEFAULT_JSON_PATH):
    """
    从指定的JSON文件加载报纸名称列表。
    JSON文件期望的格式是 {"name_newspaper_1": "报纸A", "name_newspaper_2": "报纸B", ...}
    只返回报纸名称的列表。

    Args:
        filepath (str, optional): JSON文件的路径. Defaults to DEFAULT_JSON_PATH.

    Returns:
        list: 报纸名称的列表。如果文件不存在或格式错误，则返回空列表。
        str: 描述操作结果或错误的消息。
    """
    if not os.path.exists(filepath):
        # 如果文件不存在，创建一个空的piliang.json文件，避免首次加载时报错，并提示用户
        try:
            with open(filepath, 'w', encoding='utf-8') as f:
                json.dump({}, f) # 创建一个空的json对象
            return [], f"'{filepath}' 未找到，已自动创建一个空的 '{filepath}'。"
        except IOError as e:
            return [], f"'{filepath}' 未找到，且尝试创建失败: {e}"

    try:
        with open(filepath, 'r', encoding='utf-8') as f:
            data = json.load(f)
        
        # 从类似 {"name_newspaper_1": "报纸A", ...} 的结构中提取值
        # 确保值是字符串并且不为空
        newspaper_names = [
            value for value in data.values() 
            if isinstance(value, str) and value.strip()
        ]
        # 可以考虑按键的数字后缀排序，如果需要保持特定顺序
        # 例如，如果键是 name_newspaper_10, name_newspaper_1, name_newspaper_2
        # 直接 data.values() 可能不会按数字顺序。
        # 但对于UI列表，用户可以自己排序或按添加顺序。
        # 这里我们暂时按JSON解析后的顺序。
        
        return newspaper_names, f"成功从 '{filepath}' 加载 {len(newspaper_names)} 个报纸名称。"
    except json.JSONDecodeError:
        return [], f"错误：无法解析 '{filepath}'。文件可能不是有效的JSON格式。"
    except Exception as e: # 其他可能的读取错误
        return [], f"读取 '{filepath}' 时发生未知错误: {e}"

def save_newspapers_from_list(newspaper_list, filepath=DEFAULT_JSON_PATH):
    """
    将报纸名称列表保存到指定的JSON文件。
    列表中的每个名称会对应生成一个 "name_newspaper_X" 格式的键。

    Args:
        newspaper_list (list): 包含报纸名称字符串的列表。
        filepath (str, optional): 要保存到的JSON文件的路径. Defaults to DEFAULT_JSON_PATH.

    Returns:
        bool: 操作是否成功。
        str: 描述操作结果或错误的消息。
    """
    data_to_save = {}
    for i, name in enumerate(newspaper_list):
        if isinstance(name, str) and name.strip(): # 确保只保存有效名称
            data_to_save[f"name_newspaper_{i+1}"] = name.strip()
        else:
            print(f"警告: 列表中的无效条目 '{name}' (索引 {i}) 将被忽略。") # 给开发者或控制台一些提示

    try:
        with open(filepath, 'w', encoding='utf-8') as f:
            json.dump(data_to_save, f, ensure_ascii=False, indent=4) # indent=4 使JSON文件更易读
        return True, f"成功将 {len(data_to_save)} 个报纸名称保存到 '{os.path.abspath(filepath)}'。"
    except IOError as e:
        return False, f"错误：保存到 '{filepath}' 失败: {e}"
    except Exception as e: # 其他可能的写入错误
        return False, f"写入 '{filepath}' 时发生未知错误: {e}"

# --- 用于测试的示例代码 ---
if __name__ == "__main__":
    # 测试 get_newspapers_list
    print("--- 测试加载功能 ---")
    # 创建一个临时的piliang.json用于测试（如果它不存在）
    if not os.path.exists(DEFAULT_JSON_PATH):
        print(f"'{DEFAULT_JSON_PATH}' 不存在，创建一个示例文件。")
        initial_data = {
            "name_newspaper_1": "测试报纸A",
            "name_newspaper_2": "测试报纸B",
            "name_newspaper_3": "  " # 空白名称，应该被过滤
        }
        with open(DEFAULT_JSON_PATH, 'w', encoding='utf-8') as f_temp:
            json.dump(initial_data, f_temp, ensure_ascii=False, indent=4)

    names, msg = get_newspapers_list()
    print(msg)
    if names:
        print("加载到的报纸:", names)
    
    print("\n--- 测试保存功能 ---")
    my_newspaper_list = ["人民日报", "光明日报", "经济日报", "科技日报"]
    success, msg = save_newspapers_from_list(my_newspaper_list)
    print(msg)
    if success:
        print(f"请检查 '{DEFAULT_JSON_PATH}' 文件的内容。")

    print("\n--- 测试加载保存后的文件 ---")
    names_after_save, msg_after_save = get_newspapers_list()
    print(msg_after_save)
    if names_after_save:
        print("再次加载到的报纸:", names_after_save)
        assert names_after_save == my_newspaper_list # 简单断言

    print("\n--- 测试保存空列表 ---")
    success_empty, msg_empty = save_newspapers_from_list([])
    print(msg_empty)
    if success_empty:
        names_empty, msg_load_empty = get_newspapers_list()
        print(msg_load_empty)
        print("加载空列表后的报纸:", names_empty)
        assert names_empty == []

    # 清理测试文件 (可选)
    # if os.path.exists(DEFAULT_JSON_PATH) and "测试报纸A" in names_after_save:
    #     os.remove(DEFAULT_JSON_PATH)
    #     print(f"\n测试完毕，已删除 '{DEFAULT_JSON_PATH}'。")